Micron Document
🎖️GitЯра🎖️

Node / meshtastic / Meshtastic-Android / files / desktopApp / src / main / kotlin / org / meshtastic / desktop / di / DesktopPlatformModule.kt

Displaying Raw • Download

desktopApp/src/main/kotlin/org/meshtastic/desktop/di/DesktopPlatformModule.kt fix/qr-error-correction (7b45f84f) Text, 9.88 KB

T8b949e/*
* Copyright (c) 2026 Meshtastic LLC
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program. If not, see <https://www.gnu.org/licenses/>.
*/
Tff7b72package T7ee787org.meshtastic.desktop.di

Tff7b72import T7ee787androidx.datastore.core.DataStore
Tff7b72import T7ee787androidx.datastore.core.DataStoreFactory
Tff7b72import T7ee787androidx.datastore.core.handlers.ReplaceFileCorruptionHandler
Tff7b72import T7ee787androidx.datastore.core.okio.OkioSerializer
Tff7b72import T7ee787androidx.datastore.core.okio.OkioStorage
Tff7b72import T7ee787androidx.datastore.preferences.core.PreferenceDataStoreFactory
Tff7b72import T7ee787androidx.datastore.preferences.core.Preferences
Tff7b72import T7ee787androidx.datastore.preferences.core.emptyPreferences
Tff7b72import T7ee787androidx.lifecycle.Lifecycle
Tff7b72import T7ee787androidx.lifecycle.LifecycleOwner
Tff7b72import T7ee787androidx.lifecycle.LifecycleRegistry
Tff7b72import T7ee787kotlinx.coroutines.CoroutineScope
Tff7b72import T7ee787kotlinx.coroutines.SupervisorJob
Tff7b72import T7ee787okio.FileSystem
Tff7b72import T7ee787okio.Path.Companion.toPath
Tff7b72import T7ee787org.koin.core.qualifier.named
Tff7b72import T7ee787org.koin.dsl.module
Tff7b72import T7ee787org.meshtastic.core.common.BuildConfigProvider
Tff7b72import T7ee787org.meshtastic.core.common.di.PROCESS_LIFECYCLE
Tff7b72import T7ee787org.meshtastic.core.database.desktopDataDir
Tff7b72import T7ee787org.meshtastic.core.datastore.di.CoreChannelSetDataStore
Tff7b72import T7ee787org.meshtastic.core.datastore.di.CoreLocalConfigDataStore
Tff7b72import T7ee787org.meshtastic.core.datastore.di.CoreLocalStatsDataStore
Tff7b72import T7ee787org.meshtastic.core.datastore.di.CoreModuleConfigDataStore
Tff7b72import T7ee787org.meshtastic.core.datastore.di.CorePreferencesDataStore
Tff7b72import T7ee787org.meshtastic.core.datastore.di.DataStoreScope
Tff7b72import T7ee787org.meshtastic.core.datastore.di.asCoreChannelSetDataStore
Tff7b72import T7ee787org.meshtastic.core.datastore.di.asCoreLocalConfigDataStore
Tff7b72import T7ee787org.meshtastic.core.datastore.di.asCoreLocalStatsDataStore
Tff7b72import T7ee787org.meshtastic.core.datastore.di.asCoreModuleConfigDataStore
Tff7b72import T7ee787org.meshtastic.core.datastore.di.asCorePreferencesDataStore
Tff7b72import T7ee787org.meshtastic.core.datastore.di.asDataStoreScope
Tff7b72import T7ee787org.meshtastic.core.datastore.serializer.ChannelSetSerializer
Tff7b72import T7ee787org.meshtastic.core.datastore.serializer.LocalConfigSerializer
Tff7b72import T7ee787org.meshtastic.core.datastore.serializer.LocalStatsSerializer
Tff7b72import T7ee787org.meshtastic.core.datastore.serializer.ModuleConfigSerializer
Tff7b72import T7ee787org.meshtastic.core.di.CoroutineDispatchers
Tff7b72import T7ee787org.meshtastic.core.prefs.di.AnalyticsDataStore
Tff7b72import T7ee787org.meshtastic.core.prefs.di.AppDataStore
Tff7b72import T7ee787org.meshtastic.core.prefs.di.CustomEmojiDataStore
Tff7b72import T7ee787org.meshtastic.core.prefs.di.FilterDataStore
Tff7b72import T7ee787org.meshtastic.core.prefs.di.HomoglyphEncodingDataStore
Tff7b72import T7ee787org.meshtastic.core.prefs.di.MapConsentDataStore
Tff7b72import T7ee787org.meshtastic.core.prefs.di.MapDataStore
Tff7b72import T7ee787org.meshtastic.core.prefs.di.MapTileProviderDataStore
Tff7b72import T7ee787org.meshtastic.core.prefs.di.MeshDataStore
Tff7b72import T7ee787org.meshtastic.core.prefs.di.MeshLogDataStore
Tff7b72import T7ee787org.meshtastic.core.prefs.di.RadioDataStore
Tff7b72import T7ee787org.meshtastic.core.prefs.di.UiDataStore
Tff7b72import T7ee787org.meshtastic.core.prefs.di.asAnalyticsDataStore
Tff7b72import T7ee787org.meshtastic.core.prefs.di.asAppDataStore
Tff7b72import T7ee787org.meshtastic.core.prefs.di.asCustomEmojiDataStore
Tff7b72import T7ee787org.meshtastic.core.prefs.di.asFilterDataStore
Tff7b72import T7ee787org.meshtastic.core.prefs.di.asHomoglyphEncodingDataStore
Tff7b72import T7ee787org.meshtastic.core.prefs.di.asMapConsentDataStore
Tff7b72import T7ee787org.meshtastic.core.prefs.di.asMapDataStore
Tff7b72import T7ee787org.meshtastic.core.prefs.di.asMapTileProviderDataStore
Tff7b72import T7ee787org.meshtastic.core.prefs.di.asMeshDataStore
Tff7b72import T7ee787org.meshtastic.core.prefs.di.asMeshLogDataStore
Tff7b72import T7ee787org.meshtastic.core.prefs.di.asRadioDataStore
Tff7b72import T7ee787org.meshtastic.core.prefs.di.asUiDataStore
Tff7b72import T7ee787org.meshtastic.desktop.DesktopBuildConfig
Tff7b72import T7ee787org.meshtastic.proto.ChannelSet
Tff7b72import T7ee787org.meshtastic.proto.LocalConfig
Tff7b72import T7ee787org.meshtastic.proto.LocalModuleConfig
Tff7b72import T7ee787org.meshtastic.proto.LocalStats

T8b949e/** Creates a file-backed [DataStore]<[Preferences]> at the given path under the data directory. */
Tff7b72private Tff7b72fun Td2a8ffprefsStoreTb4b4b4(Te6edf3nameTb4b4b4: Tffa657StringTb4b4b4, Te6edf3scopeTb4b4b4: Te6edf3DataStoreScopeTb4b4b4)Tb4b4b4: Te6edf3DataStoreTff7b72<Te6edf3PreferencesTff7b72> Tb4b4b4{
Tff7b72val Te6edf3dir Tff7b72= Te6edf3desktopDataDirTb4b4b4(Tb4b4b4) Tff7b72+ Ta5d6ff"Ta5d6ff/datastoreTa5d6ff"
Te6edf3FileSystemTb4b4b4.Te6edf3SYSTEMTb4b4b4.Te6edf3createDirectoriesTb4b4b4(Te6edf3dirTb4b4b4.Te6edf3toPathTb4b4b4(Tb4b4b4)Tb4b4b4)
Tff7b72return Te6edf3PreferenceDataStoreFactoryTb4b4b4.Te6edf3createWithPathTb4b4b4(
Te6edf3corruptionHandler Tff7b72= Te6edf3ReplaceFileCorruptionHandlerTb4b4b4(Te6edf3produceNewData Tff7b72= Tb4b4b4{ Te6edf3emptyPreferencesTb4b4b4(Tb4b4b4) Tb4b4b4}Tb4b4b4)Tb4b4b4,
Te6edf3scope Tff7b72= Te6edf3scopeTb4b4b4,
Te6edf3produceFile Tff7b72= Tb4b4b4{ Ta5d6ff"Tffd700$Te6edf3dirTa5d6ff/Tffd700$Te6edf3nameTa5d6ff.preferences_pbTa5d6ff"Tb4b4b4.Te6edf3toPathTb4b4b4(Tb4b4b4) Tb4b4b4}Tb4b4b4,
Tb4b4b4)
Tb4b4b4}

T8b949e/**
* Synthetic [LifecycleOwner] that stays permanently in [Lifecycle.State.RESUMED]. Replaces Android's
* `ProcessLifecycleOwner` for desktop.
*/
Tff7b72private Tff7b72class T56d364DesktopProcessLifecycleOwner Tb4b4b4: Te6edf3LifecycleOwner Tb4b4b4{
Tff7b72private Tff7b72val Te6edf3registry Tff7b72= Te6edf3LifecycleRegistryTb4b4b4(Tff7b72thisTb4b4b4)

Tff7b72init Tb4b4b4{
Te6edf3registryTb4b4b4.Te6edf3currentState Tff7b72= Te6edf3LifecycleTb4b4b4.Te6edf3StateTb4b4b4.Te6edf3RESUMED
Tb4b4b4}

Tff7b72override Tff7b72val Te6edf3lifecycleTb4b4b4: Te6edf3Lifecycle
Tff7b72getTb4b4b4(Tb4b4b4) Tff7b72= Te6edf3registry
Tb4b4b4}

T8b949e/**
* Desktop platform infrastructure module.
*
* Provides all platform-specific bindings that the real KMP `commonMain` implementations need:
* - Named [DataStore]<[Preferences]> instances (12 preference stores + 1 core preferences store)
* - Proto [DataStore] instances (LocalConfig, ModuleConfig, ChannelSet, LocalStats)
* - [Lifecycle] (`ProcessLifecycle`)
* - [BuildConfigProvider]
*/
Tff7b72fun Td2a8ffdesktopPlatformModuleTb4b4b4(Tb4b4b4) Tff7b72= Te6edf3module Tb4b4b4{
T8b949e// Application-lifetime scope shared by all DataStore instances. Per the DataStore docs:
T8b949e// "The Job within this context dictates the lifecycle of the DataStore's internal operations.
T8b949e// Ensure it is an application-scoped context that is not canceled by UI lifecycle events."
T8b949e// DataStore has no close() API — the in-memory cache is released only when this Job is cancelled
T8b949e// (at process exit). Using SupervisorJob so a single store's failure doesn't cascade.
Te6edf3singleTff7b72<Te6edf3DataStoreScopeTff7b72> Tb4b4b4{ Te6edf3CoroutineScopeTb4b4b4(Tff7b72getTff7b72<Te6edf3CoroutineDispatchersTff7b72>Tb4b4b4(Tb4b4b4)Tb4b4b4.Te6edf3io Tff7b72+ Te6edf3SupervisorJobTb4b4b4(Tb4b4b4)Tb4b4b4)Tb4b4b4.Te6edf3asDataStoreScopeTb4b4b4(Tb4b4b4) Tb4b4b4}

Te6edf3includesTb4b4b4(Te6edf3desktopPreferencesDataStoreModuleTb4b4b4(Tb4b4b4)Tb4b4b4, Te6edf3desktopProtoDataStoreModuleTb4b4b4(Tb4b4b4)Tb4b4b4)

T8b949e// -- Build config (values generated at build time by generateDesktopBuildConfig) --
Te6edf3singleTff7b72<Te6edf3BuildConfigProviderTff7b72> Tb4b4b4{
Tff7b72object Tb4b4b4: T56d364BuildConfigProvider Tb4b4b4{
Tff7b72override Tff7b72val Te6edf3isDebugTb4b4b4: Tffa657Boolean Tff7b72= Te6edf3DesktopBuildConfigTb4b4b4.Te6edf3IS_DEBUG
Tff7b72override Tff7b72val Te6edf3applicationIdTb4b4b4: Tffa657String Tff7b72= Te6edf3DesktopBuildConfigTb4b4b4.Te6edf3APPLICATION_ID
Tff7b72override Tff7b72val Te6edf3versionCodeTb4b4b4: Tffa657Int Tff7b72= Te6edf3DesktopBuildConfigTb4b4b4.Te6edf3VERSION_CODE
Tff7b72override Tff7b72val Te6edf3versionNameTb4b4b4: Tffa657String Tff7b72= Te6edf3DesktopBuildConfigTb4b4b4.Te6edf3VERSION_NAME
Tff7b72override Tff7b72val Te6edf3absoluteMinFwVersionTb4b4b4: Tffa657String Tff7b72= Te6edf3DesktopBuildConfigTb4b4b4.Te6edf3ABS_MIN_FW_VERSION
Tff7b72override Tff7b72val Te6edf3minFwVersionTb4b4b4: Tffa657String Tff7b72= Te6edf3DesktopBuildConfigTb4b4b4.Te6edf3MIN_FW_VERSION
Tb4b4b4}
Tb4b4b4}

T8b949e// -- Process Lifecycle (stays RESUMED forever on desktop) --
Te6edf3singleTb4b4b4(Te6edf3namedTb4b4b4(Te6edf3PROCESS_LIFECYCLETb4b4b4)Tb4b4b4) Tb4b4b4{ Te6edf3DesktopProcessLifecycleOwnerTb4b4b4(Tb4b4b4)Tb4b4b4.Te6edf3lifecycle Tb4b4b4}
Tb4b4b4}

T8b949e/** Typed preference-datastore singletons for each preference domain. */
Tff7b72private Tff7b72fun Td2a8ffdesktopPreferencesDataStoreModuleTb4b4b4(Tb4b4b4) Tff7b72= Te6edf3module Tb4b4b4{
Te6edf3singleTff7b72<Te6edf3AnalyticsDataStoreTff7b72> Tb4b4b4{ Te6edf3prefsStoreTb4b4b4(Ta5d6ff"Ta5d6ffanalyticsTa5d6ff"Tb4b4b4, Tff7b72getTb4b4b4(Tb4b4b4)Tb4b4b4)Tb4b4b4.Te6edf3asAnalyticsDataStoreTb4b4b4(Tb4b4b4) Tb4b4b4}
Te6edf3singleTff7b72<Te6edf3HomoglyphEncodingDataStoreTff7b72> Tb4b4b4{ Te6edf3prefsStoreTb4b4b4(Ta5d6ff"Ta5d6ffhomoglyph_encodingTa5d6ff"Tb4b4b4, Tff7b72getTb4b4b4(Tb4b4b4)Tb4b4b4)Tb4b4b4.Te6edf3asHomoglyphEncodingDataStoreTb4b4b4(Tb4b4b4) Tb4b4b4}
Te6edf3singleTff7b72<Te6edf3AppDataStoreTff7b72> Tb4b4b4{ Te6edf3prefsStoreTb4b4b4(Ta5d6ff"Ta5d6ffappTa5d6ff"Tb4b4b4, Tff7b72getTb4b4b4(Tb4b4b4)Tb4b4b4)Tb4b4b4.Te6edf3asAppDataStoreTb4b4b4(Tb4b4b4) Tb4b4b4}
Te6edf3singleTff7b72<Te6edf3CustomEmojiDataStoreTff7b72> Tb4b4b4{ Te6edf3prefsStoreTb4b4b4(Ta5d6ff"Ta5d6ffcustom_emojiTa5d6ff"Tb4b4b4, Tff7b72getTb4b4b4(Tb4b4b4)Tb4b4b4)Tb4b4b4.Te6edf3asCustomEmojiDataStoreTb4b4b4(Tb4b4b4) Tb4b4b4}
Te6edf3singleTff7b72<Te6edf3MapDataStoreTff7b72> Tb4b4b4{ Te6edf3prefsStoreTb4b4b4(Ta5d6ff"Ta5d6ffmapTa5d6ff"Tb4b4b4, Tff7b72getTb4b4b4(Tb4b4b4)Tb4b4b4)Tb4b4b4.Te6edf3asMapDataStoreTb4b4b4(Tb4b4b4) Tb4b4b4}
Te6edf3singleTff7b72<Te6edf3MapConsentDataStoreTff7b72> Tb4b4b4{ Te6edf3prefsStoreTb4b4b4(Ta5d6ff"Ta5d6ffmap_consentTa5d6ff"Tb4b4b4, Tff7b72getTb4b4b4(Tb4b4b4)Tb4b4b4)Tb4b4b4.Te6edf3asMapConsentDataStoreTb4b4b4(Tb4b4b4) Tb4b4b4}
Te6edf3singleTff7b72<Te6edf3MapTileProviderDataStoreTff7b72> Tb4b4b4{ Te6edf3prefsStoreTb4b4b4(Ta5d6ff"Ta5d6ffmap_tile_providerTa5d6ff"Tb4b4b4, Tff7b72getTb4b4b4(Tb4b4b4)Tb4b4b4)Tb4b4b4.Te6edf3asMapTileProviderDataStoreTb4b4b4(Tb4b4b4) Tb4b4b4}
Te6edf3singleTff7b72<Te6edf3MeshDataStoreTff7b72> Tb4b4b4{ Te6edf3prefsStoreTb4b4b4(Ta5d6ff"Ta5d6ffmeshTa5d6ff"Tb4b4b4, Tff7b72getTb4b4b4(Tb4b4b4)Tb4b4b4)Tb4b4b4.Te6edf3asMeshDataStoreTb4b4b4(Tb4b4b4) Tb4b4b4}
Te6edf3singleTff7b72<Te6edf3RadioDataStoreTff7b72> Tb4b4b4{ Te6edf3prefsStoreTb4b4b4(Ta5d6ff"Ta5d6ffradioTa5d6ff"Tb4b4b4, Tff7b72getTb4b4b4(Tb4b4b4)Tb4b4b4)Tb4b4b4.Te6edf3asRadioDataStoreTb4b4b4(Tb4b4b4) Tb4b4b4}
Te6edf3singleTff7b72<Te6edf3UiDataStoreTff7b72> Tb4b4b4{ Te6edf3prefsStoreTb4b4b4(Ta5d6ff"Ta5d6ffuiTa5d6ff"Tb4b4b4, Tff7b72getTb4b4b4(Tb4b4b4)Tb4b4b4)Tb4b4b4.Te6edf3asUiDataStoreTb4b4b4(Tb4b4b4) Tb4b4b4}
Te6edf3singleTff7b72<Te6edf3MeshLogDataStoreTff7b72> Tb4b4b4{ Te6edf3prefsStoreTb4b4b4(Ta5d6ff"Ta5d6ffmeshlogTa5d6ff"Tb4b4b4, Tff7b72getTb4b4b4(Tb4b4b4)Tb4b4b4)Tb4b4b4.Te6edf3asMeshLogDataStoreTb4b4b4(Tb4b4b4) Tb4b4b4}
Te6edf3singleTff7b72<Te6edf3FilterDataStoreTff7b72> Tb4b4b4{ Te6edf3prefsStoreTb4b4b4(Ta5d6ff"Ta5d6fffilterTa5d6ff"Tb4b4b4, Tff7b72getTb4b4b4(Tb4b4b4)Tb4b4b4)Tb4b4b4.Te6edf3asFilterDataStoreTb4b4b4(Tb4b4b4) Tb4b4b4}
Te6edf3singleTff7b72<Te6edf3CorePreferencesDataStoreTff7b72> Tb4b4b4{ Te6edf3prefsStoreTb4b4b4(Ta5d6ff"Ta5d6ffcore_preferencesTa5d6ff"Tb4b4b4, Tff7b72getTb4b4b4(Tb4b4b4)Tb4b4b4)Tb4b4b4.Te6edf3asCorePreferencesDataStoreTb4b4b4(Tb4b4b4) Tb4b4b4}
Tb4b4b4}

T8b949e/** The path is an on-disk identity — changing it orphans existing user data. */
Tff7b72private Tff7b72fun Tff7b72<Te6edf3TTff7b72> Td2a8ffprotoStoreTb4b4b4(
Te6edf3serializerTb4b4b4: Te6edf3OkioSerializerTff7b72<Te6edf3TTff7b72>Tb4b4b4,
Te6edf3pathTb4b4b4: Tffa657StringTb4b4b4,
Te6edf3produceNewDataTb4b4b4: Tb4b4b4(Tb4b4b4) Tff7b72-Tff7b72> Te6edf3TTb4b4b4,
Te6edf3scopeTb4b4b4: Te6edf3DataStoreScopeTb4b4b4,
Tb4b4b4)Tb4b4b4: Te6edf3DataStoreTff7b72<Te6edf3TTff7b72> Tff7b72= Te6edf3DataStoreFactoryTb4b4b4.Te6edf3createTb4b4b4(
Te6edf3storage Tff7b72= Te6edf3OkioStorageTb4b4b4(Te6edf3fileSystem Tff7b72= Te6edf3FileSystemTb4b4b4.Te6edf3SYSTEMTb4b4b4, Te6edf3serializer Tff7b72= Te6edf3serializerTb4b4b4, Te6edf3producePath Tff7b72= Tb4b4b4{ Te6edf3pathTb4b4b4.Te6edf3toPathTb4b4b4(Tb4b4b4) Tb4b4b4}Tb4b4b4)Tb4b4b4,
Te6edf3corruptionHandler Tff7b72= Te6edf3ReplaceFileCorruptionHandlerTb4b4b4(Te6edf3produceNewData Tff7b72= Tb4b4b4{ Te6edf3produceNewDataTb4b4b4(Tb4b4b4) Tb4b4b4}Tb4b4b4)Tb4b4b4,
Te6edf3scope Tff7b72= Te6edf3scopeTb4b4b4,
Tb4b4b4)

T8b949e/** Proto [DataStore] instances (OkioStorage-backed). */
Tff7b72private Tff7b72fun Td2a8ffdesktopProtoDataStoreModuleTb4b4b4(Tb4b4b4) Tff7b72= Te6edf3module Tb4b4b4{
Tff7b72val Te6edf3protoDir Tff7b72= Te6edf3desktopDataDirTb4b4b4(Tb4b4b4) Tff7b72+ Ta5d6ff"Ta5d6ff/datastoreTa5d6ff"
Te6edf3FileSystemTb4b4b4.Te6edf3SYSTEMTb4b4b4.Te6edf3createDirectoriesTb4b4b4(Te6edf3protoDirTb4b4b4.Te6edf3toPathTb4b4b4(Tb4b4b4)Tb4b4b4)

Te6edf3singleTff7b72<Te6edf3CoreLocalConfigDataStoreTff7b72> Tb4b4b4{
Te6edf3protoStoreTb4b4b4(Te6edf3LocalConfigSerializerTb4b4b4, Ta5d6ff"Tffd700$Te6edf3protoDirTa5d6ff/local_config.pbTa5d6ff"Tb4b4b4, Tb4b4b4{ Te6edf3LocalConfigTb4b4b4(Tb4b4b4) Tb4b4b4}Tb4b4b4, Tff7b72getTb4b4b4(Tb4b4b4)Tb4b4b4)
Tb4b4b4.Te6edf3asCoreLocalConfigDataStoreTb4b4b4(Tb4b4b4)
Tb4b4b4}

Te6edf3singleTff7b72<Te6edf3CoreModuleConfigDataStoreTff7b72> Tb4b4b4{
Te6edf3protoStoreTb4b4b4(Te6edf3ModuleConfigSerializerTb4b4b4, Ta5d6ff"Tffd700$Te6edf3protoDirTa5d6ff/module_config.pbTa5d6ff"Tb4b4b4, Tb4b4b4{ Te6edf3LocalModuleConfigTb4b4b4(Tb4b4b4) Tb4b4b4}Tb4b4b4, Tff7b72getTb4b4b4(Tb4b4b4)Tb4b4b4)
Tb4b4b4.Te6edf3asCoreModuleConfigDataStoreTb4b4b4(Tb4b4b4)
Tb4b4b4}

Te6edf3singleTff7b72<Te6edf3CoreChannelSetDataStoreTff7b72> Tb4b4b4{
Te6edf3protoStoreTb4b4b4(Te6edf3ChannelSetSerializerTb4b4b4, Ta5d6ff"Tffd700$Te6edf3protoDirTa5d6ff/channel_set.pbTa5d6ff"Tb4b4b4, Tb4b4b4{ Te6edf3ChannelSetTb4b4b4(Tb4b4b4) Tb4b4b4}Tb4b4b4, Tff7b72getTb4b4b4(Tb4b4b4)Tb4b4b4)
Tb4b4b4.Te6edf3asCoreChannelSetDataStoreTb4b4b4(Tb4b4b4)
Tb4b4b4}

Te6edf3singleTff7b72<Te6edf3CoreLocalStatsDataStoreTff7b72> Tb4b4b4{
Te6edf3protoStoreTb4b4b4(Te6edf3LocalStatsSerializerTb4b4b4, Ta5d6ff"Tffd700$Te6edf3protoDirTa5d6ff/local_stats.pbTa5d6ff"Tb4b4b4, Tb4b4b4{ Te6edf3LocalStatsTb4b4b4(Tb4b4b4) Tb4b4b4}Tb4b4b4, Tff7b72getTb4b4b4(Tb4b4b4)Tb4b4b4)
Tb4b4b4.Te6edf3asCoreLocalStatsDataStoreTb4b4b4(Tb4b4b4)
Tb4b4b4}
Tb4b4b4}

Served by rngit 1.5.0 - Generated in 0.08s